#include "rectangle.h"

Rectangle::Rectangle(){}

Rectangle::Rectangle(Point _p1, Point _p2)
{
	this->init(_p1, _p2);
}

// pour re-initialisation
void Rectangle::init(Point _p1, Point _p2)
{
	p_h_gauche = _p1;
	p_b_droit = _p2;
	this->genere_ligne();
}

// fonction pour la mise au Rectangle
void Rectangle::afficher(Canevas &cv)
{
	for(int i = 0 ; i < (int)rect_ligne.size() ; i++)
	{
		rect_ligne.at(i).afficher(cv);
	}
}

//Fonction pour faire tourner un Rectangle autour d'un centre
void Rectangle::rotation(Point centre, double angleRadian)
{
	Point point_tmp;
	p_b_droit.rotation(centre, angleRadian);
	p_h_gauche.rotation(centre, angleRadian);
	for(int i = 0 ; i < (int)rect_ligne.size() ; i++)
	{
		point_tmp.init(rect_ligne.at(i).valPoint1());
		point_tmp.rotation(centre, angleRadian);
		rect_ligne.at(i).changePoint1(point_tmp);
		if(i == 0)
			p_b_droit = point_tmp;

		point_tmp.init(rect_ligne.at(i).valPoint2());
		point_tmp.rotation(centre, angleRadian);
		rect_ligne.at(i).changePoint2(point_tmp);
		if(i == 1)
			p_h_gauche = point_tmp;
	}
}

// fonction pour deplacer un Rectangle en absolu.  Les parametres sont des
// deplacement par rapport a la position courante.
void Rectangle::deplacement(int deltaX, int deltaY)
{
	Point point_tmp;
	p_b_droit.deplacement(deltaX, deltaY);
	p_h_gauche.deplacement(deltaX, deltaY);
	for(int i = 0 ; i < (int)rect_ligne.size() ; i++)
	{
		point_tmp.init(rect_ligne.at(i).valPoint1());
		point_tmp.deplacement(deltaX, deltaY);
		rect_ligne.at(i).changePoint1(point_tmp);

		point_tmp.init(rect_ligne.at(i).valPoint2());
		point_tmp.deplacement(deltaX, deltaY);
		rect_ligne.at(i).changePoint2(point_tmp);
	}
}

// fonction pour deplacer un Rectangle proportionnellement a un centre.
// Les parametres sont le Rectangle de reference un la proportion du deplacement
void Rectangle::modif_taille(Point ancre, float proportion)
{
	Point point_tmp;
	p_b_droit.modif_taille(ancre, proportion);
	p_h_gauche.modif_taille(ancre, proportion);
	for(int i = 0 ; i < (int)rect_ligne.size() ; i++)
	{
		point_tmp.init(rect_ligne.at(i).valPoint1());
		point_tmp.modif_taille(ancre, proportion);
		rect_ligne.at(i).changePoint1(point_tmp);
		if(i == 0)
			p_b_droit = point_tmp;

		point_tmp.init(rect_ligne.at(i).valPoint2());
		point_tmp.modif_taille(ancre, proportion);
		rect_ligne.at(i).changePoint2(point_tmp);
		if(i == 1)
			p_h_gauche = point_tmp;
	}
}


Point Rectangle::val_P_Gauche()
{
	return p_h_gauche;
}
Point Rectangle::val_P_Droit()
{
	return p_b_droit;
}

void Rectangle::genere_ligne()
{
	Ligne ligne_tmp;
	Point point_tmp;

	point_tmp.init(p_b_droit.valX(), p_h_gauche.valY());
	ligne_tmp.init(p_h_gauche, point_tmp);
	rect_ligne.push_back(ligne_tmp);

	ligne_tmp.init(point_tmp, p_b_droit);
	rect_ligne.push_back(ligne_tmp);

	point_tmp.init(p_h_gauche.valX(), p_b_droit.valY());
	ligne_tmp.init(p_b_droit, point_tmp);
	rect_ligne.push_back(ligne_tmp);

	ligne_tmp.init(point_tmp, p_h_gauche);
	rect_ligne.push_back(ligne_tmp);
}
